/* 
 * File:   main.cpp
 * Author: SAM
 *
 * Created on April 20, 2012, 2:03 AM
 */

#include <cstdlib>
#include <cstdio>
#include <iostream>

using namespace std;

#define UP 8
#define DOWN 2
#define LEFT 4
#define RIGHT 6
#define OK 5
#define BACK 7

int data_set[3];
int selected;
int curdetik;

char* mon2string(int mon){
    switch (mon){
        case 1: return "Jan";
            break;
        case 2: return "Feb";
            break;
        case 3: return "Mar";
            break;
        case 4: return "Apr";
            break;
        case 5: return "May";
            break;
        case 6: return "Jun";
            break;
        case 7: return "Jul";
            break;
        case 8: return "Aug";
            break;
        case 9: return "Sep";
            break;
        case 10: return "Oct";
            break;
        case 11: return "Nov";
            break;
        case 12: return "Dec";
            break;
        
                    
            
    }
    
}

void TaskBlink(){
    char buffer[20];
    static int temp=0;
    if (temp&1){
        switch (selected) {
            case 0:
                sprintf(buffer,"##:%02d:%02d",data_set[1],data_set[2]);
                break;
            case 1:
                sprintf(buffer,"%02d:##:%02d",data_set[0],data_set[2]);
                break;
            case 2:
                sprintf(buffer,"%02d:%02d:##",data_set[0],data_set[1]);
                break;
        }
    } else {
        sprintf(buffer,"%02d:%02d:%02d",data_set[0],data_set[1],data_set[2]);
    }
        
    cout << buffer << endl;
    temp^=1;
    //vdelayuntil(500ms)
}

void TaskBlinkDate(){
    //beda format i.e. 12 Apr 2012
    char buffer[20];
    static int temp=0;
    if (temp&1){
        switch (selected) {
            case 0:
                sprintf(buffer,"## %s %02d",mon2string(data_set[1]),data_set[2]);
                break;
            case 1:
                sprintf(buffer,"%02d ### %02d",data_set[0],data_set[2]);
                break;
            case 2:
                sprintf(buffer,"%02d %s ##",data_set[0], mon2string(data_set[1]));
                break;
        }
    } else {
        sprintf(buffer,"%02d %s %02d",data_set[0], mon2string(data_set[1]),data_set[2]);
    }
        
    cout << buffer << endl;
    temp^=1;
    //vdelayuntil(500ms)
}

void task_edit_jam (){
    
    
    data_set[0] = data_set[1] = data_set[2] = 0; // isi clock set dengan waktu sekarang
    selected = 0;
    //jalankan task blink
    
    while (1){
        cout << "## Set Clock ##" << endl;
        TaskBlink();       //task ini akan jalan paralel
        TaskBlink();       //task ini akan jalan paralel
        int x;  cin >> x;   // ganti dengan scankey 
        
        switch (x){
            case UP:
                ++data_set[selected];
                if (data_set[0]>23){data_set[0]=0;}
                if (data_set[1]>59){data_set[1]=0;}
                if (data_set[2]>59){data_set[2]=0;}
                break;
            case DOWN:
                --data_set[selected];
                if (data_set[0]<0){data_set[0]=23;}
                if (data_set[1]<0){data_set[1]=59;}
                if (data_set[2]<0){data_set[2]=59;}
                break;
            case LEFT:
                selected=(selected==0)?2:--selected;
                break;
            case RIGHT:
                selected=(selected==2)?0:++selected;
                break;
            case OK:
                //set jam ke register
                
                cout << "sukses" << endl;//tampilkan pesan sukses + delay + delay
                
                //exit;//kill self//kill task blink
                break;
            case BACK:
                //exit;//kill self//kill task blink
                break;
        } 
    }
}

void task_edit_alarm (){
    
    
    data_set[0] = data_set[1] = data_set[2] = 0; 
    // isi clock set dengan data alarm yang aktif/ kosongkan jika tidak ada alarm yang aktif
    
    selected = 0;
     //jalankan task blink
    
    while (1){
        cout << "## Set Alarm ##" << endl;
        TaskBlink();       //task ini akan jalan paralel
        TaskBlink();       //task ini akan jalan paralel
        int x;  cin >> x;   // ganti dengan scankey 
        
        switch (x){
            case UP:
                ++data_set[selected];
                if (data_set[0]>23){data_set[0]=0;}
                if (data_set[1]>59){data_set[1]=0;}
                if (data_set[2]>59){data_set[2]=0;}
                break;
            case DOWN:
                --data_set[selected];
                if (data_set[0]<0){data_set[0]=23;}
                if (data_set[1]<0){data_set[1]=59;}
                if (data_set[2]<0){data_set[2]=59;}
                break;
            case LEFT:
                selected=(selected==0)?2:--selected;
                break;
            case RIGHT:
                selected=(selected==2)?0:++selected;
                break;
            case OK:
                //set jam ke register alarm
                
                cout << "sukses" << endl;//tampilkan pesan sukses + delay + delay
                
                //exit;//kill self//kill task blink
                break;
            case BACK:
                //exit;//kill self//kill task blink
                break;
        } 
    }
}

void task_edit_date (){
    
    
    data_set[0] = data_set[1] = data_set[2] = 1; 
    // isi data set dengan date saat ini 
    
    selected = 0;
     //jalankan TaskBlinkDate
    
    while (1){
        cout << "## Set Date  ##" << endl;
        TaskBlinkDate();       //task ini akan jalan paralel
        TaskBlinkDate();       //task ini akan jalan paralel
        int x;  cin >> x;   // ganti dengan scankey 
        
        switch (x){
            case UP:
                ++data_set[selected];
                //TODO Fungsi untuk menghitung MaxDate dalam suatu bulan pada suatu tahun
                if (data_set[0]>31){data_set[0]=1;}
                if (data_set[1]>12){data_set[1]=1;}
                if (data_set[2]>99){data_set[2]=0;}
                break;
            case DOWN:
                --data_set[selected];
                //TODO Fungsi untuk menghitung MaxDate dalam suatu bulan pada suatu tahun
                if (data_set[0]<0){data_set[0]=31;}
                if (data_set[1]<0){data_set[1]=12;}
                if (data_set[2]<0){data_set[2]=99;}
                break;
            case LEFT:
                selected=(selected==0)?2:--selected;
                break;
            case RIGHT:
                selected=(selected==2)?0:++selected;
                break;
            case OK:
                //set jam ke register alarm
                
                cout << "sukses" << endl;//tampilkan pesan sukses + delay + delay
                
                //exit;//kill self//kill task blink
                break;
            case BACK:
                //exit;//kill self//kill task blink
                break;
        } 
    }
}

int main(int argc, char** argv) {
    char *available_menu[4] = {
        "Set Clock",
        "Set  Date",
        "Set Alarm",
        "Stopwatch",
    };
    int curmenu = 0;
    int maxmenu = 4;
    
    
    while (1){
        char buffer[15];
        sprintf(buffer,"<< %s >>", available_menu[curmenu]);
        
        cout << buffer << endl; // ganti dengan lcd put
        
        int x;
        cin >> x;               // ganti dengan scankey
      
        if (x==LEFT){
            curmenu=(curmenu==0)?maxmenu-1:--curmenu;
        }else if (x==RIGHT){
            curmenu=(curmenu==(maxmenu-1))?0:++curmenu;
        }else if (x==OK){
            switch (curmenu){
                case 0:
                    //suspendself ? atau task dalam sini dikasi prioritas lebih
                    task_edit_jam(); //pangil task set jam
                    
                    break;
                case 1:
                    //suspendself ? atau task dalam sini dikasi prioritas lebih
                    //pangil task set date
                    task_edit_date();
                    break;
                case 2:
                    //suspendself ? atau task dalam sini dikasi prioritas lebih
                    task_edit_alarm();//pangil task set alarm
                    break;
                case 3:
                    //suspendself ? atau task dalam sini dikasi prioritas lebih
                    //pangil task stopwatch
                    break;
            }
                
        }
    
    }   
    
    return 0;
}


